home *** CD-ROM | disk | FTP | other *** search
- /***********************************************************************/
- /* Simple CD Player --- 24 October 1992 */
- /* */
- /* Written by John A. Junod using code ideas presented in the SDK */
- /* documentation and uses the basic code form from Quick Case. */
- /* */
- /* This program opens "CDAUDIO" when the program starts, keeps it open */
- /* while the program is running and closes it on exit. This does make */
- /* some actions take less time. Error recovery is basically non- */
- /* existant beyond giving the user a basically useless error message. */
- /* */
- /* This program has no "main" window and relies on a dialog box to do */
- /* everything. */
- /* */
- /* Modify this as much as you wish and redistribute however you wish, */
- /* but I do ask that you give me some of the credit and that you let */
- /* other people use the final product for FREE and don't charge some */
- /* silly shareware fee of $25. */
- /***********************************************************************/
-
- #include "CD.h"
-
- HWND hInst;
- HWND hMainWnd;
-
- char szBuffer[4096]; /* general purpose large buffer */
- char szBuf[256]; /* general purpose small buffer */
- char szTitle[100]; /* window title */
-
- UINT wDeviceID; /* open cd device id */
- int iCDstatus; /* cd status */
-
- #define CD_STOPPED 0
- #define CD_PLAYING 1
- #define CD_PAUSED 2
- #define CD_NOTRDY 3
- #define CD_OPEN 4
- char *szStatus[5]={"stopped","playing","paused","notready","open"};
-
- HCURSOR hHourGlass;
- HCURSOR hSaveCursor;
- HICON hIcon;
- BOOL bCanEject;
-
- int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
- LPSTR lpszCmdLine, int nCmdShow)
- {
- /***********************************************************************/
- /* HANDLE hInstance; handle for this instance */
- /* HANDLE hPrevInstance; handle for possible previous instances */
- /* LPSTR lpszCmdLine; long pointer to exec command line */
- /* int nCmdShow; Show code for main window display */
- /***********************************************************************/
-
- MCI_OPEN_PARMS mciOpenParms;
- FARPROC lpMainDlg;
- DWORD dwMCIerr;
-
- hInst = hInstance;
- if(hPrevInstance) return(0);
- hHourGlass=LoadCursor(NULL,IDC_WAIT);
- hIcon=LoadIcon(hInst,"CDICON");
-
- // open the compact disc device
- mciOpenParms.lpstrDeviceType="cdaudio";
- if(dwMCIerr=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE,
- (DWORD)(LPVOID)&mciOpenParms)) {
- // failed to open, show the error and end this program.
- showMCIError(dwMCIerr);
- return(FALSE);
- }
- // opened successfully
- wDeviceID=mciOpenParms.wDeviceID;
-
- if(dwMCIerr=CD_GetDeviceInfo(wDeviceID))
- showMCIError(dwMCIerr);
-
- iCDstatus=CD_GetCurrentStatus(wDeviceID);
-
- if((lpMainDlg=MakeProcInstance((FARPROC)MainDlg,hInst))==NULL)
- MessageBox(NULL,"MakeProc Failed","CD Error",MB_OK);
- else
- if(DialogBox(hInst,"CDBox",hMainWnd,lpMainDlg)== -1)
- MessageBox(NULL,"Couldn't create dialog box","CD Error",MB_OK);
- else
- FreeProcInstance(lpMainDlg);
-
- // close the CD device and exit program
- if(dwMCIerr=mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL))
- showMCIError(dwMCIerr);
- return TRUE;
- } /* End of WinMain */
-
-
- BOOL FAR PASCAL MainDlg(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
- {
- DWORD dwMCIerr;
- UINT uAUXerr;
- DWORD volume;
- HMENU hMenu;
-
- switch(message) {
- case WM_INITDIALOG:
- // change the system menus of this dialog box!
- hMenu=GetSystemMenu(hDlg,FALSE);
- RemoveMenu(hMenu,4,MF_BYPOSITION);
- AppendMenu(hMenu,MF_SEPARATOR,0,NULL);
- AppendMenu(hMenu,MF_STRING,IDM_SHAUTH,"About...");
- AppendMenu(hMenu,MF_SEPARATOR,0,NULL);
- AppendMenu(hMenu,MF_STRING,IDM_EJECT,"Eject");
- AppendMenu(hMenu,MF_STRING,IDM_STOP,"Stop");
- AppendMenu(hMenu,MF_STRING,IDM_PAUSE,"Pause");
- AppendMenu(hMenu,MF_STRING,IDM_PLAY,"Play");
- AppendMenu(hMenu,MF_STRING,IDM_BACK,"Backward");
- AppendMenu(hMenu,MF_STRING,IDM_FORWARD,"Forward");
- AppendMenu(hMenu,MF_STRING,IDM_STATUS,"Tracks...");
- // sub-routines use the global hMainWnd as the window to notify
- hMainWnd=hDlg;
- // format the window title line
- wsprintf(szTitle,"CD (%s) %d",
- (LPSTR)szStatus[CD_GetCurrentStatus(wDeviceID)],
- CD_GetCurrentTrack(wDeviceID));
- // display new title
- SetWindowText(hDlg,szTitle);
- // set a timer ~5 seconds to update title
- SetTimer(hDlg,1,5000,NULL);
- return(TRUE);
-
- // timer click updates title to reflect status of CD
- case WM_TIMER:
- case MM_MCINOTIFY:
- iCDstatus=CD_GetCurrentStatus(wDeviceID);
- // format the window title line
- wsprintf(szBuffer,"CD (%s) %d",
- (LPSTR)szStatus[iCDstatus],
- CD_GetCurrentTrack(wDeviceID));
- // only update it if it changes as we don't like flashing
- if(lstrcmp(szBuffer,szTitle)!=0) {
- lstrcpy(szTitle,szBuffer);
- SetWindowText(hDlg,szTitle);
- }
- break;
-
- case WM_SYSCOMMAND:
- case WM_COMMAND:
- switch(wParam) {
- // show some useful info???
- case IDM_STATUS:
- if((dwMCIerr=CD_ShowTrackTimes(wDeviceID,szBuffer))!=0L)
- showMCIError(dwMCIerr);
- break;
-
- // start play at track 1
- case IDM_PLAY:
- if((dwMCIerr=CD_PlayTrack(wDeviceID,1,0))!=0L)
- showMCIError(dwMCIerr);
- else {
- iCDstatus=CD_PLAYING;
- wsprintf(szTitle,"CD (%s) %d",(LPSTR)szStatus[iCDstatus],
- CD_GetCurrentTrack(wDeviceID));
- SetWindowText(hDlg,szTitle);
- }
- break;
-
- // if the CD is playing, backup one track, else play
- case IDM_BACK:
- if(iCDstatus==CD_PLAYING) {
- if((dwMCIerr=CD_ChangeTrack(wDeviceID,-1))!=0L)
- showMCIError(dwMCIerr);
- } else SendMessage(hDlg,WM_COMMAND,IDM_PLAY,0L);
- break;
-
- // if the CD is playing, forward one track, else play
- case IDM_FORWARD:
- if(iCDstatus==CD_PLAYING) {
- if((dwMCIerr=CD_ChangeTrack(wDeviceID,1))!=0L)
- showMCIError(dwMCIerr);
- } else SendMessage(hDlg,WM_COMMAND,IDM_PLAY,0L);
- break;
-
- // if the CD is playing, pause it, else resume play
- case IDM_PAUSE:
- if(iCDstatus==CD_PLAYING) {
- if((dwMCIerr=CD_Pause(wDeviceID))!=0L)
- showMCIError(dwMCIerr);
- else iCDstatus=CD_PAUSED;
- } else
- SendMessage(hDlg,WM_COMMAND,IDM_RESUME,0L);
- break;
-
- // if the CD is paused, resume play (play at current location)
- case IDM_RESUME:
- if(iCDstatus==CD_PAUSED || iCDstatus==CD_STOPPED) {
- if((dwMCIerr=CD_ResumePlay(wDeviceID))!=0L)
- showMCIError(dwMCIerr);
- else {
- iCDstatus=CD_PLAYING;
- wsprintf(szTitle,"CD (%s) %d",(LPSTR)szStatus[iCDstatus],
- CD_GetCurrentTrack(wDeviceID));
- SetWindowText(hDlg,szTitle);
- }
- }
- break;
-
- // if the CD is playing or pause, stop it
- case IDM_STOP:
- if(iCDstatus==CD_PLAYING || iCDstatus==CD_PAUSED) {
- if((dwMCIerr=CD_Stop(wDeviceID))!=0L)
- showMCIError(dwMCIerr);
- else iCDstatus=CD_STOPPED;
- }
- break;
-
- // untested (mine doesn't support) toggle door open/closed
- case IDM_EJECT:
- if(iCDstatus!=CD_OPEN) {
- if((dwMCIerr=CD_Open(wDeviceID))!=0L)
- showMCIError(dwMCIerr);
- else iCDstatus=CD_OPEN;
- } else if((dwMCIerr=CD_Close(wDeviceID))!=0L)
- showMCIError(dwMCIerr);
- else iCDstatus=CD_STOPPED;
- break;
-
- // this is a test routine (activated by non-visible button)
- case IDM_SHVOL:
- uAUXerr=auxGetVolume(wDeviceID,(LPDWORD)&volume);
- wsprintf(szBuf,"E:%u VL:%d VH:%d",uAUXerr,
- LOWORD(volume),HIWORD(volume));
- MessageBox(hDlg,szBuf,"CD Volume",MB_OK);
- break;
-
- // brag routine (actived by non-visible button)
- case IDM_SHAUTH:
- MessageBox(hDlg,
- "Created by John A. Junod\nzj8549@trotter.usma.edu",
- "CD Author",MB_OK);
- break;
-
- // if they select close, turn off the timer and exit
- case IDCANCEL:
- KillTimer(hDlg,1);
- EndDialog(hDlg,NULL);
- return(TRUE);
- default:
- return(DefWindowProc(hDlg,message,wParam,lParam));
- }
- return(TRUE);
-
- case WM_CLOSE:
- KillTimer(hDlg,1);
- break;
- }
- return(FALSE);
- }
-
- // use mciGetErrorString to display error
- void showMCIError(DWORD dwError) {
- char szErrorBuf[MAXERRORLENGTH];
-
- MessageBeep(MB_ICONEXCLAMATION);
- if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))
- MessageBox(hMainWnd,szErrorBuf,"MCI Error",MB_ICONEXCLAMATION);
- else
- MessageBox(hMainWnd,"Unknown Error","MCI Error",MB_ICONEXCLAMATION);
- }
-